// tcp_server.h
#pragma once
#include "lwip/tcp.h"
#include "lwip/ip_addr.h"
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

/* 回调：均在 lwIP 回调上下文中同步调用；data 仅在回调期间有效 */
typedef void (*tcp_srv_on_connect_fn)(void *user, struct tcp_pcb *tpcb);
typedef void (*tcp_srv_on_recv_fn)   (void *user, struct tcp_pcb *tpcb, const uint8_t *data, uint16_t len);
typedef void (*tcp_srv_on_closed_fn) (void *user, struct tcp_pcb *tpcb, err_t why); /* why=ERR_OK 表示对端正常关闭 */

typedef struct {
  uint16_t                port;       /* 监听端口 */
  tcp_srv_on_connect_fn   on_connect; /* 可为 NULL */
  tcp_srv_on_recv_fn      on_recv;    /* 可为 NULL */
  tcp_srv_on_closed_fn    on_closed;  /* 可为 NULL */
  void                   *user;       /* 透传给回调 */
  uint8_t                 disable_nagle; /* 1=禁用 Nagle 降低小包延迟 */
} tcp_server_cfg_t;

/* 启动/停止服务器（单实例） */
err_t tcp_server_start(const tcp_server_cfg_t *cfg);
void  tcp_server_stop(void);

/* 发送接口（从回调或主循环都可调用；失败返回 ERR_*）
   注意：可能因为窗口满返回 ERR_MEM，稍后重试或在 on_sent/poll 时继续发 */
err_t tcp_server_send(struct tcp_pcb *tpcb, const void *data, uint16_t len);

/* 广播给所有当前连接（逐个调用 tcp_server_send，遇到 ERR_MEM 会跳过该连接） */
void  tcp_server_broadcast(const void *data, uint16_t len);

#ifdef __cplusplus
}
#endif
